package com.buaa.controller;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.Month;
import cn.hutool.core.date.Quarter;
import com.buaa.common.Result;
import com.buaa.dto.LocationDTO;
import com.buaa.dto.TrafficIncidentDTO;
import com.buaa.entity.User;
import com.buaa.entity.UserExtension;
import com.buaa.enums.ResponseCode;
import com.buaa.service.impl.TrafficIncidentServiceImpl;
import com.buaa.service.impl.UserExtensionServiceImpl;
import com.buaa.service.impl.UserServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/echarts")
public class EchartsController {

    @Autowired
    private UserServiceImpl userService;

    @Autowired
    private UserExtensionServiceImpl extService;

    @Autowired
    private TrafficIncidentServiceImpl trafficIncidentService;

    // 对应 交警画像-空域 界面的数据 , table: police_user_extension
    @GetMapping("/location")
    public Result showUserAttributesByLocation() {
        Map map = new HashMap();
        List<LocationDTO>  location = extService.listUserAttributesByLocation();
        map.put("LOCATION", location);
        return Result.success(ResponseCode.ECHARTS_SUCCESS.getKey(), ResponseCode.ECHARTS_SUCCESS.getDesc(), location);
    }

    // 对应 交警画像-时域 界面的数据 ,  table: traffic_incident
    @GetMapping("/useratt")
    public Result showUserAttributes(){
        List<UserExtension> list= extService.list();
        int m1=0;//分别定义 range
        int m2=0;
        int m3=0;
        int m4=0;
        int m5=0;
        int m6=0;
        int m7=0;
        int m8=0;
        int m9=0;
// 转换为Date
        ZoneId zoneId = ZoneId.systemDefault(); // 或者使用特定的时区，如ZoneId.of("Europe/London")
        for(UserExtension user:list){
            LocalDateTime createTime=user.getJoinDate();
            ZonedDateTime zonedDateTime = createTime.atZone(zoneId);
            Date date = Date.from(zonedDateTime.toInstant());
            Date currentDate = new Date();
            int years = (int)DateUtil.betweenYear(currentDate, date,false);

            if (years<=1){
                m1 +=1;
            }
            if (years<=3) {
                m2 +=1;
            }
            if (years >=5) {
                m3 +=1;
            }
            if (years >=10) {
                m4 +=1;
            }
            if (years >=15) {
                m5 +=1;
            }
            if (years >=20) {
                m6 +=1;
            }
            if (years >=25) {
                m7 +=1;
            }
            if (years >=30) {
                m8 +=1;
            }
            if (years >=35) {
                m9 +=1;
            }
        }

        //
        List<TrafficIncidentDTO> dto =  trafficIncidentService.getIncidentByMonth();
        Map map = new HashMap();
        map.put("char1",  CollUtil.newArrayList(m1,m2,m3,m4,m5,m6,m7,m8,m9));
        map.put("char2",dto);
        map.put("open", trafficIncidentService.countOpenCase());
        map.put("close", trafficIncidentService.countClosedCase());
        map.put("users", userService.count());
        return Result.success(ResponseCode.ECHARTS_SUCCESS.getKey(), ResponseCode.ECHARTS_SUCCESS.getDesc(), map);
    }

    /**
     * 展示用户列表，并统计每个月份新增用户的数量。
     * 使用GET请求访问/users路径时调用该方法。
     *
     * @return Result对象，包含用户列表和每个月新增用户的数量。
     */
    @GetMapping("/users")
    public Result showUsersAmount(){
        List<User> list=userService.list();
        int m1=0;//分别定义四个季度
        int m2=0;
        int m3=0;
        int m4=0;
        int m5=0;
        int m6=0;
        int m7=0;
        int m8=0;
        int m9=0;
        int m10=0;
        int m11=0;
        int m12=0;
// 转换为Date
        ZoneId zoneId = ZoneId.systemDefault(); // 或者使用特定的时区，如ZoneId.of("Europe/London")
        for(User user:list){
            LocalDateTime createTime=user.getCreateTime();
            ZonedDateTime zonedDateTime = createTime.atZone(zoneId);
            Date date = Date.from(zonedDateTime.toInstant());
            Month month = DateUtil.monthEnum(date);
            switch (month){
                case JANUARY:m1+=1;break;
                case FEBRUARY:m2+=1;break;
                case MARCH:m3+=1;break;
                case APRIL:m4+=1;break;
                case MAY:m5+=1;break;
                case JUNE:m6+=1;break;
                case JULY:m7+=1;break;
                case AUGUST:m8+=1;break;
                case SEPTEMBER:m9+=1;break;
                case OCTOBER:m10+=1;break;
                case NOVEMBER:m11+=1;break;
                case UNDECIMBER:m12+=1;break;
                default:break;
            }
        }
        return Result.success(CollUtil.newArrayList(m1,m2,m3,m4,m5,m6,m7,m8));
    }


    /**
     * 获取每个季度的会员人数统计结果。
     * 通过查询所有用户信息，根据用户的创建时间计算其所属的季度，然后统计每个季度的用户数量。
     *
     * @return Result 对象，包含每个季度的会员人数统计。
     */
    @GetMapping("/members")
    public Result members(){
        List<User> list=userService.list();
        int q1=0;//分别定义四个季度
        int q2=0;
        int q3=0;
        int q4=0;
// 转换为Date
        ZoneId zoneId = ZoneId.systemDefault(); // 或者使用特定的时区，如ZoneId.of("Europe/London")
        for(User user:list){
            LocalDateTime createTime=user.getCreateTime();
            ZonedDateTime zonedDateTime = createTime.atZone(zoneId);
            Date date = Date.from(zonedDateTime.toInstant());
            Quarter quarter= DateUtil.quarterEnum(date);
            switch (quarter){
                case Q1:q1+=1;break;
                case Q2:q2+=1;break;
                case Q3:q3+=1;break;
                case Q4:q4+=1;break;
                default:break;
            }
        }
        return Result.success(CollUtil.newArrayList(q1,q2,q3,q4));
    }
}

